#ifndef _SHADOW_FILE_SYSTEM_OP_OPERATION_H_
#define _SHADOW_FILE_SYSTEM_OP_OPERATION_H_

#include <list>
#include <set>

#include <log4cxx/logger.h>
#include <log4cxx/xml/domconfigurator.h>

#include <mysql.h>

#include "sfs_common.h"

#define SFS_DBOP_NOT_FOUND -1001

using std::list;
using std::set;

class SFSDBOperation {
		public:
				SFSDBOperation();
				virtual ~SFSDBOperation();

				int get_all_data_node_config(MYSQL * mysql, list<SFS_DATA_NODE_CONFIG> & l_config);
				int get_data_node_config_by_ip_and_port(MYSQL * mysql, list<SFS_DATA_NODE_CONFIG> & l_config, \
								const char * node_ip, const int node_port);
				int get_data_node_config_by_namespace_id(MYSQL * mysql, list<SFS_DATA_NODE_CONFIG> & l_config, \
								int namespace_id);
				int add_data_node_config(MYSQL * mysql, const SFS_DATA_NODE_CONFIG config);
				int del_data_node_config(MYSQL * mysql, const char * ip, const int port);

				int get_all_namespace_config(MYSQL * mysql, list<SFS_NAMESPACE_CONFIG> & l_config);
				int get_namespace_config(MYSQL * mysql, SFS_NAMESPACE_CONFIG & config, const int namespace_id);
				int add_namespace_config(MYSQL * mysql, const SFS_NAMESPACE_CONFIG config);
				int del_namespace_config(MYSQL * mysql, const int namespace_id);
				int mod_namespace_config(MYSQL * mysql, const SFS_NAMESPACE_CONFIG config, \
								const set<string> need_mod_fields, const int namespace_id);

				int get_file_metadata(MYSQL * mysql, SFS_FILE_METADATA & metadata, const int namespace_id, \
								const char * file_path);
				int add_file_metadata(MYSQL * mysql, const SFS_FILE_METADATA metadata, const int namespace_id);
				int del_file_metadata(MYSQL * mysql, const int namespace_id, const char * file_path);
				int mod_file_metadata(MYSQL * mysql, const SFS_FILE_METADATA metadata, const set<string> need_mod_fields, \
								const int namespace_id, const char * file_path);
				int lock_file(MYSQL * mysql, const int namespace_id, const char * file_path);
				int unlock_file(MYSQL * mysql, const int namespace_id, const char * file_path);

		private:
				 log4cxx::LoggerPtr _logger;
};
#endif 
